/**
 * 日志接口定义
 * 基于 NestJS 官方示例实现
 * 参考: https://docs.nestjs.cn/fundamentals/dependency-injection
 * 对应 Java: 日志抽象
 */
export interface LoggingInterface {
  /**
   * 记录调试日志
   * @param message 日志消息
   * @param context 上下文
   * @param meta 元数据
   */
  debug(message: string, context?: string, meta?: Record<string, any>): void;

  /**
   * 记录信息日志
   * @param message 日志消息
   * @param context 上下文
   * @param meta 元数据
   */
  info(message: string, context?: string, meta?: Record<string, any>): void;

  /**
   * 记录警告日志
   * @param message 日志消息
   * @param context 上下文
   * @param meta 元数据
   */
  warn(message: string, context?: string, meta?: Record<string, any>): void;

  /**
   * 记录错误日志
   * @param message 日志消息
   * @param context 上下文
   * @param meta 元数据
   */
  error(message: string, context?: string, meta?: Record<string, any>): void;

  /**
   * 记录致命错误日志
   * @param message 日志消息
   * @param context 上下文
   * @param meta 元数据
   */
  fatal(message: string, context?: string, meta?: Record<string, any>): void;

  /**
   * 记录日志
   * @param level 日志级别
   * @param message 日志消息
   * @param context 上下文
   * @param meta 元数据
   */
  log(
    level: LogLevel,
    message: string,
    context?: string,
    meta?: Record<string, any>,
  ): void;

  /**
   * 设置日志级别
   * @param level 日志级别
   */
  setLevel(level: LogLevel): void;

  /**
   * 获取当前日志级别
   * @returns 当前日志级别
   */
  getLevel(): LogLevel;

  /**
   * 创建子日志器
   * @param context 上下文
   * @returns 子日志器
   */
  child(context: string): LoggingInterface;
}

/**
 * 日志级别
 */
export enum LogLevel {
  DEBUG = 'debug',
  INFO = 'info',
  WARN = 'warn',
  ERROR = 'error',
  FATAL = 'fatal',
}

/**
 * 结构化日志接口
 */
export interface StructuredLoggingInterface extends LoggingInterface {
  /**
   * 记录结构化日志
   * @param level 日志级别
   * @param message 日志消息
   * @param structuredData 结构化数据
   */
  logStructured(
    level: LogLevel,
    message: string,
    structuredData: StructuredLogData,
  ): void;

  /**
   * 记录请求日志
   * @param request 请求数据
   * @param response 响应数据
   * @param duration 持续时间
   */
  logRequest(
    request: RequestLogData,
    response: ResponseLogData,
    duration: number,
  ): void;

  /**
   * 记录数据库查询日志
   * @param query 查询数据
   * @param duration 持续时间
   * @param result 结果数据
   */
  logDatabaseQuery(
    query: DatabaseQueryLogData,
    duration: number,
    result?: any,
  ): void;

  /**
   * 记录缓存操作日志
   * @param operation 操作数据
   * @param hit 是否命中
   * @param duration 持续时间
   */
  logCacheOperation(
    operation: CacheOperationLogData,
    hit: boolean,
    duration: number,
  ): void;

  /**
   * 记录外部API调用日志
   * @param apiCall API调用数据
   * @param response 响应数据
   * @param duration 持续时间
   */
  logExternalApiCall(
    apiCall: ExternalApiCallLogData,
    response: any,
    duration: number,
  ): void;

  /**
   * 记录业务事件日志
   * @param event 事件数据
   * @param user 用户数据
   * @param meta 元数据
   */
  logBusinessEvent(
    event: BusinessEventLogData,
    user?: UserLogData,
    meta?: Record<string, any>,
  ): void;
}

/**
 * 结构化日志数据
 */
export interface StructuredLogData {
  timestamp: string;
  level: LogLevel;
  message: string;
  context?: string;
  traceId?: string;
  spanId?: string;
  userId?: string;
  sessionId?: string;
  requestId?: string;
  correlationId?: string;
  meta?: Record<string, any>;
  error?: ErrorLogData;
}

/**
 * 请求日志数据
 */
export interface RequestLogData {
  method: string;
  url: string;
  headers: Record<string, string>;
  body?: any;
  query?: Record<string, any>;
  params?: Record<string, any>;
  ip?: string;
  userAgent?: string;
  userId?: string;
  sessionId?: string;
}

/**
 * 响应日志数据
 */
export interface ResponseLogData {
  statusCode: number;
  headers: Record<string, string>;
  body?: any;
  size?: number;
}

/**
 * 数据库查询日志数据
 */
export interface DatabaseQueryLogData {
  operation: string;
  table: string;
  query: string;
  params?: any[];
  connection?: string;
  transaction?: string;
}

/**
 * 缓存操作日志数据
 */
export interface CacheOperationLogData {
  operation: string;
  key: string;
  ttl?: number;
  size?: number;
}

/**
 * 外部API调用日志数据
 */
export interface ExternalApiCallLogData {
  service: string;
  endpoint: string;
  method: string;
  headers: Record<string, string>;
  body?: any;
  timeout?: number;
}

/**
 * 业务事件日志数据
 */
export interface BusinessEventLogData {
  event: string;
  action: string;
  resource: string;
  resourceId?: string;
  data?: Record<string, any>;
  result?: 'success' | 'failure' | 'partial';
}

/**
 * 用户日志数据
 */
export interface UserLogData {
  id: string;
  username?: string;
  email?: string;
  role?: string;
  permissions?: string[];
}

/**
 * 错误日志数据
 */
export interface ErrorLogData {
  name: string;
  message: string;
  stack?: string;
  code?: string;
  cause?: any;
  context?: Record<string, any>;
}

/**
 * 日志配置
 */
export interface LoggingConfig {
  level: LogLevel;
  format: 'json' | 'text' | 'simple';
  timestamp: boolean;
  colorize: boolean;
  prettyPrint: boolean;
  silent: boolean;
  exitOnError: boolean;
  transports: LogTransport[];
  defaultMeta?: Record<string, any>;
  context?: string;
}

/**
 * 日志传输器
 */
export interface LogTransport {
  type: 'console' | 'file' | 'http' | 'stream';
  level?: LogLevel;
  format?: string;
  options?: Record<string, any>;
}

/**
 * 日志装饰器选项
 */
export interface LoggingOptions {
  /**
   * 日志级别
   */
  level?: LogLevel;

  /**
   * 上下文
   */
  context?: string;

  /**
   * 是否记录参数
   */
  logArgs?: boolean;

  /**
   * 是否记录返回值
   */
  logResult?: boolean;

  /**
   * 是否记录执行时间
   */
  logDuration?: boolean;

  /**
   * 是否记录错误
   */
  logError?: boolean;

  /**
   * 是否启用
   */
  enabled?: boolean;

  /**
   * 自定义消息
   */
  message?: string;

  /**
   * 元数据
   */
  meta?: Record<string, any>;
}
